Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>GNU Compiler Collection</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/GNU_Compiler_Collection"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-GNU_Compiler_Collection rootpage-GNU_Compiler_Collection skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">GNU Compiler Collection</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><table class="float-right infobox toccolours toptextcells" style="border-spacing:5px; font-size:90%; text-align:left; width:21em;">

<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:105%; text-align:center;">GNU Compiler Collection
<p class="mw-empty-elt">
</p>
</th></tr>
<tr>
<td colspan="2" class="notheme" style="text-align:center; background-color:#f8f9fa;"><span typeof="mw:File"></span>
</td></tr>
<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
<p class="mw-empty-elt">
</p>
</th></tr>
<tr>
<td><b><a href="Maintainer" title="Maintainer">Maintainer</a></b>
</td>
<td><span class="wikidata-content">Richard Biener<sup id="cite_ref-_da2072b5f4cbde13_1-0" class="reference"><a href="#cite_note-_da2072b5f4cbde13-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>, Jakub Jelínek<sup id="cite_ref-_69031d7195eba49f_2-0" class="reference"><a href="#cite_note-_69031d7195eba49f-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup></span>
</td></tr>
<tr>
<td><b><a href="Softwareentwickler" title="Softwareentwickler">Entwickler</a></b>
</td>
<td><span class="wikidata-content"><a href="GNU-Projekt" title="GNU-Projekt">GNU-Projekt</a></span>
</td></tr>
<tr>
<td><b>Erscheinungsjahr</b>
</td>
<td><span class="wikidata-content">23. Mai 1987<sup id="cite_ref-_0bc3f6acaf0f9fc2_3-0" class="reference"><a href="#cite_note-_0bc3f6acaf0f9fc2-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup></span>
</td></tr>
<tr>
<td><b>Aktuelle&nbsp;<a href="Version_(Software)" title="Version (Software)">Version</a></b>
</td>
<td><span class="wikidata-content">15.2<sup id="cite_ref-_69df5708495a442b_4-0" class="reference"><a href="#cite_note-_69df5708495a442b-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup></span> <br> (<span class="wikidata-content">8. August 2025</span>)
</td></tr>
<tr>
<td><b><a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a></b>
</td>
<td>plattformübergreifend
</td></tr>
<tr>
<td><b><a href="Programmiersprache" title="Programmiersprache">Programmier­sprache</a></b>
</td>
<td><span class="wikidata-content"><a href="C%2B%2B" title="C++">C++</a>, <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a></span>
</td></tr>
<tr>
<td><b>Kategorie</b>
</td>
<td><a href="Compiler" title="Compiler">Compiler</a>
</td></tr>
<tr>
<td><b>Lizenz</b>
</td>
<td><span class="wikidata-content"><a href="GPLv3" class="mw-redirect" title="GPLv3">GNU General Public License, Version 3</a>, GNU Lesser General Public License, Version 2.1</span>
</td></tr>
<tr>
<td class="hintergrundfarbe5" colspan="2" style="text-align:center;"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/">gcc.gnu.org</a>
</td></tr></tbody></table>
<p><b>GCC</b> ist der Name der <a href="Compiler" title="Compiler">Compiler</a>-Suite des <a href="GNU-Projekt" title="GNU-Projekt">GNU-Projekts</a>. <b>GCC</b> stand ursprünglich für <b>GNU C Compiler</b>. Da GCC heute aber außer <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a> noch einige andere Programmiersprachen übersetzen kann, hat GCC inzwischen die Bedeutung <b>GNU Compiler Collection</b> erhalten (<a href="Englische_Sprache" title="Englische Sprache">englisch</a> für <i>GNU-Compilersammlung</i>). Das Kommando <b>gcc</b> (in Kleinbuchstaben) steht weiterhin für den C-Compiler.
</p>

<div class="mw-heading mw-heading2"><h2 id="Überblick"><span id=".C3.9Cberblick"></span>Überblick</h2></div>
<p>Die Sammlung enthält <a href="Compiler" title="Compiler">Compiler</a> für die <a href="Programmiersprache" title="Programmiersprache">Programmiersprachen</a> <a href="C_(Programmiersprache)" title="C (Programmiersprache)">C</a>, <a href="C%2B%2B" title="C++">C++</a>, <a href="Objective-C" title="Objective-C">Objective-C</a>, <a href="D_(Programmiersprache)" title="D (Programmiersprache)">D</a>, <a href="Fortran" title="Fortran">Fortran</a>, <a href="Ada_(Programmiersprache)" title="Ada (Programmiersprache)">Ada</a> und <a href="Go_(Programmiersprache)" title="Go (Programmiersprache)">Go</a>. Sie unterliegt den Bedingungen der <a href="GNU_General_Public_License" title="GNU General Public License">GNU General Public License</a>.
</p><p>GCC wird von einer Reihe von Systemen als Standardcompiler genutzt, darunter viele <a href="Linux-Distribution" title="Linux-Distribution">Linux-Distributionen</a>, <a href="Berkeley_Software_Distribution" title="Berkeley Software Distribution">BSD</a>-Varianten, <a href="OPENSTEP" title="OPENSTEP">NeXTStep</a>, <a href="BeOS" title="BeOS">BeOS</a> und <a href="ZETA" title="ZETA">ZETA</a>. Zudem bietet er auch Unterstützung für die Laufzeitumgebung <a href="Cygwin" title="Cygwin">Cygwin</a> und die Entwicklerwerkzeuge <a href="MinGW" title="MinGW">MinGW</a>.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> Er wurde auf mehr Systeme und Rechnerarchitekturen portiert als jeder andere Compiler und bietet sich insbesondere für <a href="Betriebssystem" title="Betriebssystem">Betriebssysteme</a> an, die auf verschiedenen <a href="Hardware" title="Hardware">Hardwareplattformen</a> laufen sollen. Der GCC lässt sich auch als <a href="Cross-Compiler" title="Cross-Compiler">Cross-Compiler</a> installieren.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p><p>2014 erhielt er den <a href="Programming_Languages_Software_Award" title="Programming Languages Software Award">Programming Languages Software Award</a> von ACM SIGPLAN.
</p>
<div class="mw-heading mw-heading2"><h2 id="Geschichte">Geschichte</h2></div>
<p>Die erste öffentliche Version (0.9) des GCC wurde am 22.&nbsp;März 1987 von <a href="Richard_Stallman" title="Richard Stallman">Richard Stallman</a><sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> für das <a href="GNU-Projekt" title="GNU-Projekt">GNU-Projekt</a> freigegeben (Version 1.0 erschien am 23.&nbsp;Mai desselben Jahres) und wird heute von Programmierern auf der ganzen Welt weiterentwickelt. Die Erweiterung des C-Compilerpakets zur Compiler-Collection erfolgte im Rahmen des EGCS-Projektes, das eine Weile parallel zum GCC existierte und schließlich zum offiziellen GCC wurde.
</p>
<div class="mw-heading mw-heading3"><h3 id="EGCS">EGCS</h3></div>
<p>1997 spaltete sich das Projekt <i>Experimental/Enhanced GNU Compiler System</i> (<i>EGCS</i>, engl. für <i>experimentelles/verbessertes GNU-Compilersystem</i>) von GCC ab, und wurde 1999 mit diesem wieder vereinigt.<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p><p>GCC 1.x hatte 1991 eine gewisse Stabilität erreicht, jedoch verhinderten architekturbedingte Einschränkungen viele Verbesserungen, sodass die <a href="Free_Software_Foundation" title="Free Software Foundation">Free Software Foundation</a> (FSF) damit begann, GCC 2.x zu entwickeln. Mitte der 1990er kontrollierte die FSF jedoch sehr genau, was zu GCC 2.x hinzugefügt werden durfte und was nicht, sodass GCC als Beispiel für das „Cathedral“-Entwicklungsmodell Verwendung fand, das <a href="Eric_S._Raymond" title="Eric S. Raymond">Eric S. Raymond</a> in seinem Buch <a href="Die_Kathedrale_und_der_Basar" title="Die Kathedrale und der Basar">Die Kathedrale und der Basar</a> beschreibt.
</p><p>Da GCC freie Software ist, ist es Programmierern, die in eine andere Richtung arbeiten wollten, erlaubt, eigene <a href="Abspaltung_(Softwareentwicklung)" title="Abspaltung (Softwareentwicklung)">Abspaltungen</a> zu entwickeln. Viele Abspaltungen erwiesen sich jedoch als ineffizient und unübersichtlich. Dass ihre Arbeiten vom offiziellen GCC-Projekt oft nicht, oder nur unter Schwierigkeiten akzeptiert wurden, frustrierte viele Entwickler.
</p><p>Daher gründete eine Gruppe von Entwicklern 1997 EGCS, um mehrere experimentelle Abspaltungen in einem einzigen Projekt zu vereinen. Dazu gehörten g77 (<a href="Fortran" title="Fortran">Fortran</a>), PGCC (<a href="Pentium" class="mw-redirect" title="Pentium">Pentium</a>-optimierter GCC), das Einpflegen vieler Verbesserungen an C++, sowie Compiler-Versionen für weitere Prozessor-Architekturen und Betriebssysteme.
</p><p>Die Entwicklung von EGCS erwies sich als schneller, lebhafter und insgesamt besser als die des GCC-Projektes, sodass die FSF 1999 offiziell die Weiterentwicklung von GCC 2.x einstellte und stattdessen EGCS als offizielle GCC-Version übernahm. Die EGCS-Entwickler wurden zu Projektverantwortlichen (engl. <span lang="en"><i><a href="Maintainer" title="Maintainer">maintainer</a></i></span>) des GCC. Von da an wurde das Projekt explizit nach dem „Basar“-Modell entwickelt, nicht mehr nach dem „Cathedral“-Modell. Mit der Veröffentlichung von GCC 2.95 im Juli 1999 waren beide Projekte wiedervereinigt.
</p>
<div class="mw-heading mw-heading2"><h2 id="Zielsysteme">Zielsysteme</h2></div>

<p>Das GCC-Projekt bezeichnet einige Plattformen offiziell als primäre und andere als sekundäre Evaluationsplattformen. Vor jeder Veröffentlichung einer neuen Version werden insbesondere diese beiden Gruppen getestet. GCC kann Programme für folgende Befehlssatzarchitekturen erzeugen (primäre und sekundäre Evaluationsplattformen sind markiert):
</p>
<ul><li><a href="Alpha-Prozessor" title="Alpha-Prozessor">Alpha</a></li>
<li><a href="Arm-Architektur" class="mw-redirect" title="Arm-Architektur">Arm</a>: sowohl AArch32 (ab <a href="Arm-Architektur#ARMv1" class="mw-redirect" title="Arm-Architektur">ARMv1</a> bis <a href="Arm-Architektur#Armv9-A" class="mw-redirect" title="Arm-Architektur">Armv9-A</a>, 32-Bit) als auch AArch64 (ab <a href="Arm-Architektur#Armv8-A" class="mw-redirect" title="Arm-Architektur">Armv8-A</a>, auch „ARM64“, 64-Bit) (sekundär, unter Linux)</li>
<li><a href="Hitachi_H8" class="mw-redirect" title="Hitachi H8">H8/300</a></li>
<li><a href="S/370" class="mw-redirect" title="S/370">S/370</a>, <a href="S/390" class="mw-redirect" title="S/390">S/390</a></li>
<li><a href="IA-32" title="IA-32">i386</a> (32-Bit-<a href="X86-Architektur" title="X86-Architektur">x86</a>) und <a href="X64" title="X64">x86-64</a></li>
<li><a href="Itanium-Architektur" title="Itanium-Architektur">Itanium</a> (IA-64)</li>
<li><a href="Motorola_68000" title="Motorola 68000">Motorola 68000</a> und <a href="Motorola_Coldfire" class="mw-redirect" title="Motorola Coldfire">Motorola Coldfire</a></li>
<li><a href="Motorola_88000" class="mw-redirect" title="Motorola 88000">Motorola 88000</a></li>
<li><a href="MIPS-Architektur" title="MIPS-Architektur">MIPS-Architektur</a> (primär unter <a href="IRIX" title="IRIX">IRIX</a>)</li>
<li><a href="PA-RISC" title="PA-RISC">PA-RISC</a> (primär unter <a href="HP-UX" title="HP-UX">HP-UX</a>)</li>
<li><a href="PDP-11" title="PDP-11">PDP-11</a></li>
<li><a href="PowerPC" title="PowerPC">PowerPC</a></li>
<li><a href="RISC-V" title="RISC-V">RISC-V</a></li>
<li><a href="SuperH" title="SuperH">SuperH</a></li>
<li><a href="Sun_SPARC" class="mw-redirect" title="Sun SPARC">Sun SPARC</a> (primär unter Solaris, sekundär unter Linux)</li>
<li><a href="Virtual_Address_eXtension" title="Virtual Address eXtension">VAX</a></li></ul>
<p>Dazu kommt noch eine Reihe von Architekturen von Prozessoren für <a href="Eingebettetes_System" title="Eingebettetes System">eingebettete Systeme</a>, wie
</p>
<ul><li>Motorola <a href="68HC11" class="mw-redirect" title="68HC11">68HC11</a></li>
<li>A29K</li>
<li>Adapteva Epiphany</li>
<li>Atmel <a href="Atmel_AVR" class="mw-redirect" title="Atmel AVR">AVR</a></li>
<li><a href="Blackfin" title="Blackfin">Blackfin</a></li>
<li>C4x</li>
<li><a href="ETRAX_CRIS" title="ETRAX CRIS">CRIS</a></li>
<li>D30V</li>
<li>DSP16xx</li>
<li>FR-30</li>
<li>FR-V</li>
<li><a href="Intel_i960" title="Intel i960">Intel i960</a></li>
<li>IP2000</li>
<li>M32R</li>
<li>MCORE</li>
<li><a href="MicroBlaze" title="MicroBlaze">MicroBlaze</a></li>
<li><a href="MMIX" title="MMIX">MMIX</a></li>
<li>MN10200, MN10300</li>
<li>NS32K</li>
<li>ROMP</li>
<li>Stormy16</li>
<li>Synopsis Designware ARC</li>
<li>Texas Instruments <a href="TI_MSP430" title="TI MSP430">MSP430</a>, MSP432</li>
<li>V850</li>
<li>Xtensa</li></ul>
<p>Nicht Bestandteil des offiziellen GCC, aber davon abgeleitet und kommerziell vertrieben gibt es Derivate für
</p>
<ul><li>Atmel <a href="Atmel_AVR32" title="Atmel AVR32">AVR32</a></li>
<li>Infineon <a href="C167" title="C167">C167</a></li>
<li>Infineon <a href="Infineon_TriCore" title="Infineon TriCore">TriCore</a></li>
<li>Microchip <a href="PICmicro#Kostenloser_Compiler" title="PICmicro">PIC</a>24, dsPIC (nur in C) und PIC32 (auch in C++)</li></ul>
<p>Insgesamt unterstützt der GCC mehr als 60 Plattformen.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Struktur">Struktur</h2></div>

<p>Das externe Interface des gcc entspricht dem eines Standard-Unix-Compilers.
</p>
<ol><li>Der Benutzer ruft ein Hauptprogramm mit dem Namen <code>gcc</code> auf.</li>
<li>GCC interpretiert das Kommandozeilen-Argument.</li>
<li>GCC stellt die Programmiersprache der vorliegenden Eingabedatei fest.</li>
<li>Der entsprechende Sprach-<a href="Compiler" title="Compiler">Compiler</a> wird aufgerufen.</li>
<li>Die Ausgabe wird dem <a href="Assembler_(Informatik)" title="Assembler (Informatik)">Assembler</a> übergeben.</li>
<li>Schließlich wird der <a href="Linker_(Computerprogramm)" title="Linker (Computerprogramm)">Linker</a> aufgerufen.</li>
<li>Ein vollständiges, d.&nbsp;h. lauffähiges <a href="Computerprogramm" title="Computerprogramm">Programm</a> wurde erstellt.</li></ol>
<p>Jeder Sprachcompiler ist ein separates Programm, das Quellcode entgegennimmt und Assemblersprache produziert. Im abgebildeten Schema sind Beispiele für C und Assembler gegeben, welche sich beide dem <a href="Pr%C3%A4prozessor" title="Präprozessor">Preprocessing</a> unterziehen müssen, bei dem Compiler<a href="Makro" title="Makro">makros</a>, eingebundene <a href="Header-Datei" title="Header-Datei">Header-Dateien</a> und Ähnliches umgewandelt werden, um reinen C-Code bzw. Assembler zu erhalten. Jenes sprachabhängige <a href="Frontend" class="mw-redirect" title="Frontend">Frontend</a> <a href="Parser" title="Parser">parst</a> die entsprechende Sprache und erzeugt einen <a href="Abstrakter_Syntaxbaum" class="mw-redirect" title="Abstrakter Syntaxbaum">abstrakten</a> <a href="Syntaxbaum" title="Syntaxbaum">Syntaxbaum</a>, der an ein <a href="Front-End_und_Back-End" class="mw-redirect" title="Front-End und Back-End">Backend</a> übergeben wird, das den Baum in GCCs <i><span lang="en">Register Transfer Language</span> (RTL)</i> überführt (im Diagramm nicht gezeigt), verschiedene <a href="Compiler#Programmoptimierung_(ausführlich)" title="Compiler">Codeoptimierungen</a> durchführt und zum Schluss <a href="Assemblersprache" title="Assemblersprache">Assemblersprache</a> erzeugt.
</p><p>Ursprünglich wurden die meisten Bestandteile der GCC in C geschrieben. Im Rahmen des Vorhabens „GCC in Cxx“<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> wurde 2010 die Umstellungen der gcc-Quellen auf C++ geplant und begonnen. Ziel dieser Umstellung ist, die GCC verständlich und wartbar zu halten. Im Nachfolgeprojekt<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup> wurde auch die noch fehlende Stufe 1 des GCC-Bauprozesses auf C++-Code umgestellt.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup> Ausnahmen sind Backends, die in wesentlichen Teilen in RTL formuliert sind, sowie das Ada-Frontend, welches zum größten Teil in Ada geschrieben ist.
</p>
<div class="mw-heading mw-heading3"><h3 id="Frontends">Frontends</h3></div>
<p>Frontends müssen Bäume produzieren, die vom Backend verarbeitet werden können. Wie sie dies erreichen, bleibt ihnen überlassen. Einige <a href="Parser" title="Parser">Parser</a> benutzen <a href="Yacc" title="Yacc">Yacc</a>-ähnliche Grammatiken, andere verwenden handgeschriebene, rekursive Parser.
</p><p>Mit dem Tree-<a href="Static_Single_Assignment" class="mw-redirect" title="Static Single Assignment">SSA</a>-Projekt, das in die Version GCC 4.0 integriert wurde, wurden zwei neue Formen von sprachunabhängigen Bäumen eingeführt. Diese neuen Baumformate wurden <i>GENERIC</i> und <i>GIMPLE</i> getauft. Parsing wird nun durchgeführt, indem ein temporärer sprachabhängiger Baum nach GENERIC konvertiert wird. Der sogenannte „Gimplifier“ überführt diese komplexe Form in die SSA-basierte GIMPLE-Form, von der ausgehend eine Reihe neuer sprach- und architekturunabhängiger Optimierungen durchgeführt werden kann.
</p>
<div class="mw-heading mw-heading3"><h3 id="Middleend">Middleend</h3></div>
<p>Optimierung an Bäumen passt eigentlich nicht in das Schema von „Frontend“ und „Backend“, da sie nicht sprachabhängig sind und kein Parsen beinhalten. Die GCC-Entwickler haben diesem Teil des Compilers daher den Namen „Middleend“ gegeben. Zu den gegenwärtig am SSA-Baum durchgeführten Optimierungen gehören <i><a href="Dead_code_elimination" class="mw-redirect" title="Dead code elimination">Dead code elimination</a></i>, <i>Partial Redundancy Elimination</i>, <i>Global Value Numbering</i>, <i>Sparse Conditional Constant Propagation</i>, <i>Scalar replacement of Aggregates</i> und <a href="Feld_(Datentyp)" class="mw-redirect" title="Feld (Datentyp)">Array</a>-basierende Optimierungen, wie automatische Vektorisierung.<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Backend">Backend</h3></div>
<p>Das Verhalten des GCC-Backends wird teilweise durch Präprozessor-Makros und architekturspezifische Funktionen bestimmt, mit denen zum Beispiel die <a href="Byte-Reihenfolge" title="Byte-Reihenfolge">Endianness</a>, Wortgröße, und Aufrufkonventionen definiert und die Registerstruktur der Zielmaschine beschrieben werden. Unter Verwendung der Maschinenbeschreibung, einer <a href="Lisp" title="Lisp">Lisp</a>-ähnlichen Beschreibungssprache, wandelt GCC die interne Baumstruktur in die RTL-Darstellung um. Obwohl diese dem Namen nach prozessorunabhängig ist, ist die Sequenz an abstrakten Instruktionen daher bereits an das Ziel angepasst.
</p><p>Die Art und Anzahl der vom GCC an der RTL durchgeführten Optimierungen werden mit jeder Compiler-Version weiterentwickelt. Zu ihnen gehören etwa <i>(global) <a href="Common_subexpression_elimination" title="Common subexpression elimination">common subexpression elimination</a></i>, verschiedene Schleifen- und Sprungoptimierungen (<span style="font-style:normal;font-weight:normal"><a href="Englische_Sprache" title="Englische Sprache">englisch</a></span> <span lang="en-Latn" style="font-style:italic"><i>if-conversion, branch probability estimation, sibling calls, constant propagation</i>, ...</span>) sowie der <i>combine-pass</i>, in dem mehrere Instruktionen zu einer einzigen kombiniert werden können.
</p><p>Seit der Einführung von globalen SSA-basierten Optimierungen an GIMPLE-Bäumen haben die RTL-Optimierungen leicht an Bedeutung verloren, da in der RTL-Repräsentation des Programms weit weniger der für viele Optimierungen wichtigen High-Level-Informationen enthalten sind. Allerdings sind auch maschinenabhängige Optimierungen sehr wichtig, da für viele Optimierungen Informationen über die Maschine vorliegen müssen, etwa darüber, welche Instruktionen eine Maschine kennt, wie teuer diese sind und wie die <a href="Pipeline_(Prozessor)" title="Pipeline (Prozessor)">Pipeline</a> der Zielarchitektur beschaffen ist.
</p><p>In der „Reload“-Phase wird die prinzipiell unbeschränkte Anzahl an abstrakten Pseudo-<a href="Register_(Computer)" class="mw-redirect" title="Register (Computer)">Registern</a> durch die begrenzte Anzahl an echten Maschinenregistern ersetzt, wobei hier unter Umständen neue Instruktionen in den Code eingefügt werden müssen, um zum Beispiel Pseudo-Register auf dem <a href="Stapelspeicher" title="Stapelspeicher">Stack</a> der Funktion zwischenzuspeichern. Diese <a href="Registerzuteilung" title="Registerzuteilung">Registerzuteilung</a> ist recht kompliziert, da die verschiedenen Eigenheiten der jeweiligen Zielarchitektur besonders berücksichtigt werden müssen.
</p><p>In der letzten Phase werden Optimierungen durchgeführt, wie <i>peephole optimization</i> und <i><a href="Branch_Delay_Slot" title="Branch Delay Slot">delay slot scheduling</a></i>, bevor die recht maschinennahe Ausprägung der RTL auf Assemblercode abgebildet wird, indem die Namen von Registern und Adressen in Zeichenketten umgesetzt werden, welche die Instruktionen spezifizieren.
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="GNU_Compiler_for_Java" title="GNU Compiler for Java">GNU Compiler for Java</a></li>
<li><a href="GNU_Pascal" title="GNU Pascal">GNU Pascal</a></li>
<li><a href="GNU_Fortran" title="GNU Fortran">GNU Fortran</a></li>
<li><a href="GNU_Debugger" title="GNU Debugger">GNU Debugger</a></li>
<li><a href="GNU_Assembler" title="GNU Assembler">GNU Assembler</a></li>
<li><a href="GNU_Make" title="GNU Make">GNU Make</a></li>
<li><a href="GNU_Build_System" title="GNU Build System">GNU_Build_System</a></li>
<li><a href="Distcc" title="Distcc">distcc</a>, <a href="Ccache" title="Ccache">ccache</a></li>
<li><a href="MinGW" title="MinGW">MinGW</a>, eine Portierung auf Windows</li>
<li><a href="Portable_C_Compiler" title="Portable C Compiler">Portable C Compiler</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Nikolaus Schüler: <i>Der Gcc-Compiler: Überblick und Bedienung</i>. bhv, 1997. ISBN 3-89360-873-7.</li>
<li>Brian J. Gough, Richard M. Stallman: <i><a rel="nofollow" class="external text" href="https://github.com/briangough/gccintro">An Introduction to GCC: For the GNU Compilers GCC and G++</a></i>. Network Theory Ltd. 2004. ISBN 978-0-954-16179-8.</li>
<li>William von Hagen: <i>The Definitive Guide to GCC</i>. 2. Ausgabe, Apress 2006. ISBN 978-1-590-59585-5.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-_da2072b5f4cbde13-1"><span class="mw-cite-backlink"><a href="#cite_ref-_da2072b5f4cbde13_1-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=MAINTAINERS"><cite style="font-style:italic">gcc.gnu.org</cite>.</a> (abgerufen am 27.&nbsp;Mai 2022).</span>
</li>
<li id="cite_note-_69031d7195eba49f-2"><span class="mw-cite-backlink"><a href="#cite_ref-_69031d7195eba49f_2-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://github.com/gcc-mirror/gcc/graphs/contributors"><cite style="font-style:italic">github.com</cite>.</a></span>
</li>
<li id="cite_note-_0bc3f6acaf0f9fc2-3"><span class="mw-cite-backlink"><a href="#cite_ref-_0bc3f6acaf0f9fc2_3-0">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://www.gnu.org/software/gcc/releases.html"><cite style="font-style:italic">www.gnu.org</cite>.</a></span>
</li>
<li id="cite_note-_69df5708495a442b-4"><span class="mw-cite-backlink"><a href="#cite_ref-_69df5708495a442b_4-0">↑</a></span> <span class="reference-text">Richard Biener: <a rel="nofollow" class="external text" href="https://lists.gnu.org/archive/html/info-gnu/2025-08/msg00002.html"><cite class="lang" lang="en" dir="auto" style="font-style:italic"><span lang="en">GCC 15.2 Released</span></cite>.</a> 8.&nbsp;August 2025 (englisch, abgerufen am 8.&nbsp;August 2025).</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><span class="cite">Jens Ihlenfeld: <a rel="nofollow" class="external text" href="http://www.golem.de/1008/76893.html"><i>Compiler GCC 4.5.1 veröffentlicht.</i></a> golem.de, 2.&nbsp;August 2010,<span class="Abrufdatum"> abgerufen am 27.&nbsp;April 2015</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AGNU+Compiler+Collection&amp;rft.title=Compiler+GCC+4.5.1+ver%C3%B6ffentlicht&amp;rft.description=Compiler+GCC+4.5.1+ver%C3%B6ffentlicht&amp;rft.identifier=http%3A%2F%2Fwww.golem.de%2F1008%2F76893.html&amp;rft.creator=Jens+Ihlenfeld&amp;rft.publisher=golem.de&amp;rft.date=2010-08-02">&nbsp;</span></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text">Nikolaus Schüler: <i>Der Gcc-Compiler – Überblick und Bedienung</i>. 1. Auflage. bhv, Kaarst 1997, S. 28. ISBN 3-89360-873-7</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><a href="#cite_ref-7">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://groups.google.com/forum/#!msg/mod.compilers/ynAVuwR7dPw/-IirjtgwPxsJ">GNU C compiler beta test release</a> – Nachricht bei <i><a href="Google_Groups" title="Google Groups">Google Groups</a></i>, vom 22. März 1987, abgerufen am 1. März 2017 (englisch).</span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><a href="#cite_ref-8">↑</a></span> <span class="reference-text"><span class="cite">Alexander Neumann: <a rel="nofollow" class="external text" href="https://www.heise.de/newsticker/meldung/GCC-4-7-und-25-Jahre-GNU-Compiler-Collection-1478304.html"><i>GCC 4.7 und 25 Jahre GNU Compiler Collection.</i></a> heise.de, 22.&nbsp;März 2012,<span class="Abrufdatum"> abgerufen am 24.&nbsp;März 2012</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AGNU+Compiler+Collection&amp;rft.title=GCC+4.7+und+25+Jahre+GNU+Compiler+Collection&amp;rft.description=GCC+4.7+und+25+Jahre+GNU+Compiler+Collection&amp;rft.identifier=https%3A%2F%2Fwww.heise.de%2Fnewsticker%2Fmeldung%2FGCC-4-7-und-25-Jahre-GNU-Compiler-Collection-1478304.html&amp;rft.creator=Alexander+Neumann&amp;rft.publisher=heise.de&amp;rft.date=2012-03-22">&nbsp;</span></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><a href="#cite_ref-9">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="http://gnu.ist.utl.pt/software/gcc/faq.html#gcc"><i>GCC FAQ: What is the relationship between GCC and EGCS?</i></a> In: <i>gnu.ist.utl.pt.</i> 21.&nbsp;Juni 2006,<span class="Abrufdatum"> abgerufen am 2.&nbsp;Juni 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AGNU+Compiler+Collection&amp;rft.title=GCC+FAQ%3A+What+is+the+relationship+between+GCC+and+EGCS%3F&amp;rft.description=GCC+FAQ%3A+What+is+the+relationship+between+GCC+and+EGCS%3F&amp;rft.identifier=http%3A%2F%2Fgnu.ist.utl.pt%2Fsoftware%2Fgcc%2Ffaq.html%23gcc&amp;rft.date=2006-06-21&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><a href="#cite_ref-10">↑</a></span> <span class="reference-text"><i><a rel="nofollow" class="external text" href="https://gcc.gnu.org/install/specific.html">Host/Target specific installation notes for GCC</a>.</i> In: <i>gnu.org</i>, 23.&nbsp;Februar 2006 (englisch).</span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><a href="#cite_ref-11">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/wiki/gcc-in-cxx"><i>THE GCC Wiki - gcc-in-cxx.</i></a> In: <i>gcc.gnu.org.</i> Gnu Org, 6.&nbsp;April 2012,<span class="Abrufdatum"> abgerufen am 4.&nbsp;Mai 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AGNU+Compiler+Collection&amp;rft.title=THE+GCC+Wiki+-+gcc-in-cxx&amp;rft.description=THE+GCC+Wiki+-+gcc-in-cxx&amp;rft.identifier=https%3A%2F%2Fgcc.gnu.org%2Fwiki%2Fgcc-in-cxx&amp;rft.publisher=Gnu+Org&amp;rft.date=2012-04-06&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><a href="#cite_ref-12">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/wiki/cxx-conversion"><i>cxx-conversion - GCC Wiki.</i></a> In: <i>gcc.gnu.org.</i> 11.&nbsp;Dezember 2012,<span class="Abrufdatum"> abgerufen am 4.&nbsp;Mai 2022</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AGNU+Compiler+Collection&amp;rft.title=cxx-conversion+-+GCC+Wiki&amp;rft.description=cxx-conversion+-+GCC+Wiki&amp;rft.identifier=https%3A%2F%2Fgcc.gnu.org%2Fwiki%2Fcxx-conversion&amp;rft.date=2012-12-11&amp;rft.language=en">&nbsp;</span></span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><a href="#cite_ref-13">↑</a></span> <span class="reference-text"><span class="cite">Thorsten Leemhuis: <a rel="nofollow" class="external text" href="https://www.heise.de/newsticker/meldung/GCC-setzt-intern-verstaerkt-auf-C-1668224.html"><i>GCC setzt intern verstärkt auf C++.</i></a> heise.de, 16.&nbsp;August 2012,<span class="Abrufdatum"> abgerufen am 26.&nbsp;April 2015</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AGNU+Compiler+Collection&amp;rft.title=GCC+setzt+intern+verst%C3%A4rkt+auf+C%2B%2B&amp;rft.description=GCC+setzt+intern+verst%C3%A4rkt+auf+C%2B%2B&amp;rft.identifier=https%3A%2F%2Fwww.heise.de%2Fnewsticker%2Fmeldung%2FGCC-setzt-intern-verstaerkt-auf-C-1668224.html&amp;rft.creator=Thorsten+Leemhuis&amp;rft.publisher=heise.de&amp;rft.date=2012-08-16">&nbsp;</span></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><a href="#cite_ref-14">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://gcc.gnu.org/projects/tree-ssa/vectorization.html"><i>Auto-vectorization in GCC</i></a>. gcc.gnu.org, abgerufen am 25. Juli 2021 (englisch).</span>
</li>
</ol>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><div class="noresize noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Commons"></span></span></div><b><span class=""><a class="external text" href="https://commons.wikimedia.org/wiki/GCC?uselang=de"><span lang="en">Commons</span>: GNU Compiler Collection</a></span></b>&nbsp;– Album mit Bildern, Videos und Audiodateien</div>
<ul><li><a rel="nofollow" class="external text" href="https://gcc.gnu.org">GCC, the GNU Compiler Collection</a> – offizielle Website (englisch)</li></ul>
<div class="hintergrundfarbe1 rahmenfarbe1 navigation-not-searchable normdaten-typ-s" style="border-style: solid; border-width: 1px; clear: left; margin-bottom:1em; margin-top:1em; padding: 0.25em; overflow: hidden; word-break: break-word; word-wrap: break-word;" id="normdaten">
<div style="display: table-cell; vertical-align: middle; width: 100%;">
<div>
Normdaten&nbsp;(Sachbegriff): <a href="Gemeinsame_Normdatei" title="Gemeinsame Normdatei">GND</a>: <span class="-print"><a rel="nofollow" class="external text" href="https://d-nb.info/gnd/4294848-4">4294848-4</a></span> </div>
</div></div></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-04-19" href="https://de.wikipedia.org/wiki/?title=GNU_Compiler_Collection&amp;oldid=255270156">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>